home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 60 / IOPROG_60.ISO / soft / c++ / gsl-1.1.1-setup.exe / {app} / src / specfunc / psi.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-04-18  |  19.0 KB  |  638 lines

  1. /* specfunc/psi.c
  2.  * 
  3.  * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
  4.  * 
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or (at
  8.  * your option) any later version.
  9.  * 
  10.  * This program is distributed in the hope that it will be useful, but
  11.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19.  
  20. /* Author: G. Jungman */
  21.  
  22. #include <config.h>
  23. #include <gsl/gsl_math.h>
  24. #include <gsl/gsl_errno.h>
  25. #include <gsl/gsl_sf_exp.h>
  26. #include <gsl/gsl_sf_gamma.h>
  27. #include <gsl/gsl_sf_zeta.h>
  28. #include <gsl/gsl_sf_psi.h>
  29.  
  30. #include "error.h"
  31.  
  32. #include "chebyshev.h"
  33. #include "cheb_eval.c"
  34.  
  35. /*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
  36.  
  37.  
  38. /* Chebyshev fit for f(y) = Re(Psi(1+Iy)) + M_EULER - y^2/(1+y^2) - y^2/(2(4+y^2))
  39.  * 1 < y < 10
  40.  *   ==>
  41.  * y(x) = (9x + 11)/2,  -1 < x < 1
  42.  * x(y) = (2y - 11)/9
  43.  *
  44.  * g(x) := f(y(x))
  45.  */
  46. static double r1py_data[] = {
  47.    1.59888328244976954803168395603,
  48.    0.67905625353213463845115658455,
  49.   -0.068485802980122530009506482524,
  50.   -0.005788184183095866792008831182,
  51.    0.008511258167108615980419855648,
  52.   -0.004042656134699693434334556409,
  53.    0.001352328406159402601778462956,
  54.   -0.000311646563930660566674525382,
  55.    0.000018507563785249135437219139,
  56.    0.000028348705427529850296492146,
  57.   -0.000019487536014574535567541960,
  58.    8.0709788710834469408621587335e-06,
  59.   -2.2983564321340518037060346561e-06,
  60.    3.0506629599604749843855962658e-07,
  61.    1.3042238632418364610774284846e-07,
  62.   -1.2308657181048950589464690208e-07,
  63.    5.7710855710682427240667414345e-08,
  64.   -1.8275559342450963966092636354e-08,
  65.    3.1020471300626589420759518930e-09,
  66.    6.8989327480593812470039430640e-10,
  67.   -8.7182290258923059852334818997e-10,
  68.    4.4069147710243611798213548777e-10,
  69.   -1.4727311099198535963467200277e-10,
  70.    2.7589682523262644748825844248e-11,
  71.    4.1871826756975856411554363568e-12,
  72.   -6.5673460487260087541400767340e-12,
  73.    3.4487900886723214020103638000e-12,
  74.   -1.1807251417448690607973794078e-12,
  75.    2.3798314343969589258709315574e-13,
  76.    2.1663630410818831824259465821e-15
  77. };
  78. static cheb_series r1py_cs = {
  79.   r1py_data,
  80.   29,
  81.   -1,1,
  82.   18
  83. };
  84.  
  85.  
  86. /* Chebyshev fits from SLATEC code for psi(x)
  87.  
  88.  Series for PSI        on the interval  0.       to  1.00000D+00
  89.                        with weighted error   2.03E-17
  90.                     log weighted error  16.69
  91.                   significant figures required  16.39
  92.                    decimal places required  17.37
  93.  
  94.  Series for APSI       on the interval  0.       to  2.50000D-01
  95.                        with weighted error   5.54E-17
  96.                     log weighted error  16.26
  97.                   significant figures required  14.42
  98.                    decimal places required  16.86
  99.  
  100. */
  101.  
  102. static double psics_data[23] = {
  103.   -.038057080835217922,
  104.    .491415393029387130, 
  105.   -.056815747821244730,
  106.    .008357821225914313,
  107.   -.001333232857994342,
  108.    .000220313287069308,
  109.   -.000037040238178456,
  110.    .000006283793654854,
  111.   -.000001071263908506,
  112.    .000000183128394654,
  113.   -.000000031353509361,
  114.    .000000005372808776,
  115.   -.000000000921168141,
  116.    .000000000157981265,
  117.   -.000000000027098646,
  118.    .000000000004648722,
  119.   -.000000000000797527,
  120.    .000000000000136827,
  121.   -.000000000000023475,
  122.    .000000000000004027,
  123.   -.000000000000000691,
  124.    .000000000000000118,
  125.   -.000000000000000020
  126. };
  127. static cheb_series psi_cs = {
  128.   psics_data,
  129.   22,
  130.   -1, 1,
  131.   17
  132. };
  133.  
  134. static double apsics_data[16] = {    
  135.   -.0204749044678185,
  136.   -.0101801271534859,
  137.    .0000559718725387,
  138.   -.0000012917176570,
  139.    .0000000572858606,
  140.   -.0000000038213539,
  141.    .0000000003397434,
  142.   -.0000000000374838,
  143.    .0000000000048990,
  144.   -.0000000000007344,
  145.    .0000000000001233,
  146.   -.0000000000000228,
  147.    .0000000000000045,
  148.   -.0000000000000009,
  149.    .0000000000000002,
  150.   -.0000000000000000 
  151. };    
  152. static cheb_series apsi_cs = {
  153.   apsics_data,
  154.   15,
  155.   -1, 1,
  156.   9
  157. };
  158.  
  159. #define PSI_TABLE_NMAX 100
  160. static double psi_table[PSI_TABLE_NMAX+1] = {
  161.   0.0,  /* Infinity */              /* psi(0) */
  162.  -M_EULER,                          /* psi(1) */
  163.   0.42278433509846713939348790992,  /* ...    */
  164.   0.92278433509846713939348790992,
  165.   1.25611766843180047272682124325,
  166.   1.50611766843180047272682124325,
  167.   1.70611766843180047272682124325,
  168.   1.87278433509846713939348790992,
  169.   2.01564147795560999653634505277,
  170.   2.14064147795560999653634505277,
  171.   2.25175258906672110764745616389,
  172.   2.35175258906672110764745616389,
  173.   2.44266167997581201673836525479,
  174.   2.52599501330914535007169858813,
  175.   2.60291809023222227314862166505,
  176.   2.67434666166079370172005023648,
  177.   2.74101332832746036838671690315,
  178.   2.80351332832746036838671690315,
  179.   2.86233685773922507426906984432,
  180.   2.91789241329478062982462539988,
  181.   2.97052399224214905087725697883,
  182.   3.02052399224214905087725697883,
  183.   3.06814303986119666992487602645,
  184.   3.11359758531574212447033057190,
  185.   3.15707584618530734186163491973,
  186.   3.1987425128519740085283015864,
  187.   3.2387425128519740085283015864,
  188.   3.2772040513135124700667631249,
  189.   3.3142410883505495071038001619,
  190.   3.3499553740648352213895144476,
  191.   3.3844381326855248765619282407,
  192.   3.4177714660188582098952615740,
  193.   3.4500295305349872421533260902,
  194.   3.4812795305349872421533260902,
  195.   3.5115825608380175451836291205,
  196.   3.5409943255438998981248055911,
  197.   3.5695657541153284695533770196,
  198.   3.5973435318931062473311547974,
  199.   3.6243705589201332743581818244,
  200.   3.6506863483938174848844976139,
  201.   3.6763273740348431259101386396,
  202.   3.7013273740348431259101386396,
  203.   3.7257176179372821503003825420,
  204.   3.7495271417468059598241920658,
  205.   3.7727829557002943319172153216,
  206.   3.7955102284275670591899425943,
  207.   3.8177324506497892814121648166,
  208.   3.8394715810845718901078169905,
  209.   3.8607481768292527411716467777,
  210.   3.8815815101625860745049801110,
  211.   3.9019896734278921969539597029,
  212.   3.9219896734278921969539597029,
  213.   3.9415975165651470989147440166,
  214.   3.9608282857959163296839747858,
  215.   3.9796962103242182164764276160,
  216.   3.9982147288427367349949461345,
  217.   4.0163965470245549168131279527,
  218.   4.0342536898816977739559850956,
  219.   4.0517975495308205809735289552,
  220.   4.0690389288411654085597358518,
  221.   4.0859880813835382899156680552,
  222.   4.1026547480502049565823347218,
  223.   4.1190481906731557762544658694,
  224.   4.1351772229312202923834981274,
  225.   4.1510502388042361653993711433,
  226.   4.1666752388042361653993711433,
  227.   4.1820598541888515500147557587,
  228.   4.1972113693403667015299072739,
  229.   4.2121367424746950597388624977,
  230.   4.2268426248276362362094507330,
  231.   4.2413353784508246420065521823,
  232.   4.2556210927365389277208378966,
  233.   4.2697055997787924488475984600,
  234.   4.2835944886676813377364873489,
  235.   4.2972931188046676391063503626,
  236.   4.3108066323181811526198638761,
  237.   4.3241399656515144859531972094,
  238.   4.3372978603883565912163551041,
  239.   4.3502848733753695782293421171,
  240.   4.3631053861958823987421626300,
  241.   4.3757636140439836645649474401,
  242.   4.3882636140439836645649474401,
  243.   4.4006092930563293435772931191,
  244.   4.4128044150075488557724150703,
  245.   4.4248526077786331931218126607,
  246.   4.4367573696833950978837174226,
  247.   4.4485220755657480390601880108,
  248.   4.4601499825424922251066996387,
  249.   4.4716442354160554434975042364,
  250.   4.4830078717796918071338678728,
  251.   4.4942438268358715824147667492,
  252.   4.5053549379469826935258778603,
  253.   4.5163439489359936825368668713,
  254.   4.5272135141533849868846929582,
  255.   4.5379662023254279976373811303,
  256.   4.5486045001977684231692960239,
  257.   4.5591308159872421073798223397,
  258.   4.5695474826539087740464890064,
  259.   4.5798567610044242379640147796,
  260.   4.5900608426370772991885045755,
  261.   4.6001618527380874001986055856
  262. };
  263.  
  264.  
  265. #define PSI_1_TABLE_NMAX 100
  266. static double psi_1_table[PSI_1_TABLE_NMAX+1] = {
  267.   0.0,  /* Infinity */              /* psi(1,0) */
  268.  -M_PI*M_PI/6.0,                    /* psi(1,1) */
  269.   0.644934066848226436472415,       /* ...      */
  270.   0.394934066848226436472415,
  271.   0.2838229557371153253613041,
  272.   0.2213229557371153253613041,
  273.   0.1813229557371153253613041,
  274.   0.1535451779593375475835263,
  275.   0.1331370146940314251345467,
  276.   0.1175120146940314251345467,
  277.   0.1051663356816857461222010,
  278.   0.0951663356816857461222010,
  279.   0.0869018728717683907503002,
  280.   0.0799574284273239463058557,
  281.   0.0740402686640103368384001,
  282.   0.0689382278476838062261552,
  283.   0.0644937834032393617817108,
  284.   0.0605875334032393617817108,
  285.   0.0571273257907826143768665,
  286.   0.0540409060376961946237801,
  287.   0.0512708229352031198315363,
  288.   0.0487708229352031198315363,
  289.   0.0465032492390579951149830,
  290.   0.0444371335365786562720078,
  291.   0.0425467743683366902984728,
  292.   0.0408106632572255791873617,
  293.   0.0392106632572255791873617,
  294.   0.0377313733163971768204978,
  295.   0.0363596312039143235969038,
  296.   0.0350841209998326909438426,
  297.   0.0338950603577399442137594,
  298.   0.0327839492466288331026483,
  299.   0.0317433665203020901265817,
  300.   0.03076680402030209012658168,
  301.   0.02984853037475571730748159,
  302.   0.02898347847164153045627052,
  303.   0.02816715194102928555831133,
  304.   0.02739554700275768062003973,
  305.   0.02666508681283803124093089,
  306.   0.02597256603721476254286995,
  307.   0.02531510384129102815759710,
  308.   0.02469010384129102815759710,
  309.   0.02409521984367056414807896,
  310.   0.02352832641963428296894063,
  311.   0.02298749353699501850166102,
  312.   0.02247096461137518379091722,
  313.   0.02197713745088135663042339,
  314.   0.02150454765882086513703965,
  315.   0.02105185413233829383780923,
  316.   0.02061782635456051606003145,
  317.   0.02020133322669712580597065,
  318.   0.01980133322669712580597065,
  319.   0.01941686571420193164987683,
  320.   0.01904704322899483105816086,
  321.   0.01869104465298913508094477,
  322.   0.01834810912486842177504628,
  323.   0.01801753061247172756017024,
  324.   0.01769865306145131939690494,
  325.   0.01739086605006319997554452,
  326.   0.01709360088954001329302371,
  327.   0.01680632711763538818529605,
  328.   0.01652854933985761040751827,
  329.   0.01625980437882562975715546,
  330.   0.01599965869724394401313881,
  331.   0.01574770606433893015574400,
  332.   0.01550356543933893015574400,
  333.   0.01526687904880638577704578,
  334.   0.01503731063741979257227076,
  335.   0.01481454387422086185273411,
  336.   0.01459828089844231513993134,
  337.   0.01438824099085987447620523,
  338.   0.01418415935820681325171544,
  339.   0.01398578601958352422176106,
  340.   0.01379288478501562298719316,
  341.   0.01360523231738567365335942,
  342.   0.01342261726990576130858221,
  343.   0.01324483949212798353080444,
  344.   0.01307170929822216635628920,
  345.   0.01290304679189732236910755,
  346.   0.01273868124291638877278934,
  347.   0.01257845051066194236996928,
  348.   0.01242220051066194236996928,
  349.   0.01226978472038606978956995,
  350.   0.01212106372098095378719041,
  351.   0.01197590477193174490346273,
  352.   0.01183418141592267460867815,
  353.   0.01169577311142440471248438,
  354.   0.01156056489076458859566448,
  355.   0.01142844704164317229232189,
  356.   0.01129931481023821361463594,
  357.   0.01117306812421372175754719,
  358.   0.01104961133409026496742374,
  359.   0.01092885297157366069257770,
  360.   0.01081070552355853781923177,
  361.   0.01069508522063334415522437,
  362.   0.01058191183901270133041676,
  363.   0.01047110851491297833872701,
  364.   0.01036260157046853389428257,
  365.   0.01025632035036012704977199,  /* ...        */
  366.   0.01015219706839427948625679,  /* psi(1,99)  */
  367.   0.01005016666333357139524567   /* psi(1,100) */
  368. };
  369.  
  370.  
  371. /*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
  372.  
  373. int gsl_sf_psi_int_e(const int n, gsl_sf_result * result)
  374. {
  375.   /* CHECK_POINTER(result) */
  376.  
  377.   if(n <= 0) {
  378.     DOMAIN_ERROR(result);
  379.   }
  380.   else if(n <= PSI_TABLE_NMAX) {
  381.     result->val = psi_table[n];
  382.     result->err = GSL_DBL_EPSILON * fabs(result->val);
  383.     return GSL_SUCCESS;
  384.   }
  385.   else {
  386.     /* Abramowitz+Stegun 6.3.18 */
  387.     const double c2 = -1.0/12.0;
  388.     const double c3 =  1.0/120.0;
  389.     const double c4 = -1.0/252.0;
  390.     const double c5 =  1.0/240.0;
  391.     const double ni2 = (1.0/n)*(1.0/n);
  392.     const double ser = ni2 * (c2 + ni2 * (c3 + ni2 * (c4 + ni2*c5)));
  393.     result->val  = log(n) - 0.5/n + ser;
  394.     result->err  = GSL_DBL_EPSILON * (fabs(log(n)) + fabs(0.5/n) + fabs(ser));
  395.     result->err += GSL_DBL_EPSILON * fabs(result->val);
  396.     return GSL_SUCCESS;
  397.   }
  398. }
  399.  
  400.  
  401. int gsl_sf_psi_e(const double x, gsl_sf_result * result)
  402. {
  403.   const double y = fabs(x);
  404.  
  405.   /* CHECK_POINTER(result) */
  406.  
  407.   if(x == 0.0 || x == -1.0 || x == -2.0) {
  408.     DOMAIN_ERROR(result);
  409.   }
  410.   else if(y >= 2.0) {
  411.     const double t = 8.0/(y*y)-1.0;
  412.     gsl_sf_result result_c;
  413.     cheb_eval_e(&apsi_cs, t, &result_c);
  414.     if(x < 0.0) {
  415.       const double s = sin(M_PI*x);
  416.       const double c = cos(M_PI*x);
  417.       if(fabs(s) < 2.0*GSL_SQRT_DBL_MIN) {
  418.         DOMAIN_ERROR(result);
  419.       }
  420.       else {
  421.         result->val  = log(y) - 0.5/x + result_c.val - M_PI * c/s;
  422.     result->err  = M_PI*fabs(x)*GSL_DBL_EPSILON/(s*s);
  423.     result->err += result_c.err;
  424.         result->err += GSL_DBL_EPSILON * fabs(result->val);
  425.     return GSL_SUCCESS;
  426.       }
  427.     }
  428.     else {
  429.       result->val  = log(y) - 0.5/x + result_c.val;
  430.       result->err  = result_c.err;
  431.       result->err += GSL_DBL_EPSILON * fabs(result->val);
  432.       return GSL_SUCCESS;
  433.     }
  434.   }
  435.   else { /* -2 < x < 2 */
  436.     gsl_sf_result result_c;
  437.  
  438.     if(x < -1.0) { /* x = -2 + v */
  439.       const double v  = x + 2.0;
  440.       const double t1 = 1.0/x;
  441.       const double t2 = 1.0/(x+1.0);
  442.       const double t3 = 1.0/v;
  443.       cheb_eval_e(&psi_cs, 2.0*v-1.0, &result_c);
  444.       
  445.       result->val  = -(t1 + t2 + t3) + result_c.val;
  446.       result->err  = GSL_DBL_EPSILON * (fabs(t1) + fabs(x/(t2*t2)) + fabs(x/(t3*t3)));
  447.       result->err += result_c.err;
  448.       result->err += GSL_DBL_EPSILON * fabs(result->val);
  449.       return GSL_SUCCESS;
  450.     }
  451.     else if(x < 0.0) { /* x = -1 + v */
  452.       const double v  = x + 1.0;
  453.       const double t1 = 1.0/x;
  454.       const double t2 = 1.0/v;
  455.       cheb_eval_e(&psi_cs, 2.0*v-1.0, &result_c);
  456.       
  457.       result->val  = -(t1 + t2) + result_c.val;
  458.       result->err  = GSL_DBL_EPSILON * (fabs(t1) + fabs(x/(t2*t2)));
  459.       result->err += result_c.err;
  460.       result->err += GSL_DBL_EPSILON * fabs(result->val);
  461.       return GSL_SUCCESS;
  462.     }
  463.     else if(x < 1.0) { /* x = v */
  464.       const double t1 = 1.0/x;
  465.       cheb_eval_e(&psi_cs, 2.0*x-1.0, &result_c);
  466.       
  467.       result->val  = -t1 + result_c.val;
  468.       result->err  = GSL_DBL_EPSILON * t1;
  469.       result->err += result_c.err;
  470.       result->err += GSL_DBL_EPSILON * fabs(result->val);
  471.       return GSL_SUCCESS;
  472.     }
  473.     else { /* x = 1 + v */
  474.       const double v = x - 1.0;
  475.       return cheb_eval_e(&psi_cs, 2.0*v-1.0, result);
  476.     }
  477.   }
  478. }
  479.  
  480.  
  481. int
  482. gsl_sf_psi_1piy_e(const double y, gsl_sf_result * result)
  483. {
  484.   const double ay = fabs(y);
  485.  
  486.   /* CHECK_POINTER(result) */
  487.  
  488.   if(ay > 1000.0) {
  489.     /* [Abramowitz+Stegun, 6.3.19] */
  490.     const double yi2 = 1.0/(ay*ay);
  491.     const double lny = log(y); /* FIXME: y < 0 ?? */
  492.     const double sum = yi2 * (1.0/12.0 + 1.0/120.0 * yi2 + 1.0/252.0 * yi2*yi2);
  493.     result->val = lny + sum;
  494.     result->err = 2.0 * GSL_DBL_EPSILON * (fabs(lny) + fabs(sum));
  495.     return GSL_SUCCESS;
  496.   }
  497.   else if(ay > 10.0) {
  498.     /* [Abramowitz+Stegun, 6.3.19] */
  499.     const double yi2 = 1.0/(ay*ay);
  500.     const double lny = log(y);
  501.     const double sum = yi2 * (1.0/12.0 +
  502.                          yi2 * (1.0/120.0 +
  503.                        yi2 * (1.0/252.0 +
  504.                              yi2 * (1.0/240.0 +
  505.                                yi2 * (1.0/132.0 + 691.0/32760.0 * yi2)))));
  506.     result->val = lny + sum;
  507.     result->err = 2.0 * GSL_DBL_EPSILON * (fabs(lny) + fabs(sum));
  508.     return GSL_SUCCESS;
  509.   }
  510.   else if(ay > 1.0){
  511.     const double y2 = ay*ay;
  512.     const double x  = (2.0*ay - 11.0)/9.0;
  513.     const double v  = y2*(1.0/(1.0+y2) + 0.5/(4.0+y2));
  514.     gsl_sf_result result_c;
  515.     cheb_eval_e(&r1py_cs, x, &result_c);
  516.     result->val  = result_c.val - M_EULER + v;
  517.     result->err  = result_c.err;
  518.     result->err += 2.0 * GSL_DBL_EPSILON * (fabs(v) + M_EULER + fabs(result_c.val));
  519.     result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
  520.     result->err *= 5.0; /* FIXME: losing a digit somewhere... maybe at x=... ? */
  521.     return GSL_SUCCESS;
  522.   }
  523.   else {
  524.     /* [Abramowitz+Stegun, 6.3.17]
  525.      *
  526.      * -M_EULER + y^2 Sum[1/n 1/(n^2 + y^2), {n,1,M}]
  527.      *   +     Sum[1/n^3, {n,M+1,Infinity}]
  528.      *   - y^2 Sum[1/n^5, {n,M+1,Infinity}]
  529.      *   + y^4 Sum[1/n^7, {n,M+1,Infinity}]
  530.      *   - y^6 Sum[1/n^9, {n,M+1,Infinity}]
  531.      *   + O(y^8)
  532.      *
  533.      * We take M=50 for at least 15 digit precision.
  534.      */
  535.     const int M = 50;
  536.     const double y2 = y*y;
  537.     const double c0 = 0.00019603999466879846570;
  538.     const double c2 = 3.8426659205114376860e-08;
  539.     const double c4 = 1.0041592839497643554e-11;
  540.     const double c6 = 2.9516743763500191289e-15;
  541.     const double p  = c0 + y2 *(-c2 + y2*(c4 - y2*c6));
  542.     double sum = 0.0;
  543.     double v;
  544.     
  545.     int n;
  546.     for(n=1; n<=M; n++) {
  547.       sum += 1.0/(n * (n*n + y*y));
  548.     }
  549.  
  550.     v = y2 * (sum + p);
  551.     result->val  = -M_EULER + v;
  552.     result->err  = GSL_DBL_EPSILON * (M_EULER + fabs(v));
  553.     result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
  554.     return GSL_SUCCESS;
  555.   }
  556. }
  557.  
  558.  
  559. int gsl_sf_psi_1_int_e(const int n, gsl_sf_result * result)
  560. {
  561.   /* CHECK_POINTER(result) */
  562.   if(n <= 0) {
  563.     DOMAIN_ERROR(result);
  564.   }
  565.   else if(n <= PSI_1_TABLE_NMAX) {
  566.     result->val = psi_1_table[n];
  567.     result->err = GSL_DBL_EPSILON * result->val;
  568.     return GSL_SUCCESS;
  569.   }
  570.   else {
  571.     /* Abramowitz+Stegun 6.4.12
  572.      * double-precision for n > 100
  573.      */
  574.     const double c0 = -1.0/30.0;
  575.     const double c1 =  1.0/42.0;
  576.     const double c2 = -1.0/30.0;
  577.     const double ni2 = (1.0/n)*(1.0/n);
  578.     const double ser =  ni2*ni2 * (c0 + ni2*(c1 + c2*ni2));
  579.     result->val = (1.0 + 0.5/n + 1.0/(6.0*n*n) + ser) / n;
  580.     result->err = GSL_DBL_EPSILON * result->val;
  581.     return GSL_SUCCESS;
  582.   }
  583. }
  584.  
  585.  
  586. int gsl_sf_psi_n_e(const int n, const double x, gsl_sf_result * result)
  587. {
  588.   /* CHECK_POINTER(result) */
  589.  
  590.   if(n < 0 || x <= 0.0) {
  591.     DOMAIN_ERROR(result);
  592.   }
  593.   else if(n == 0) {
  594.     return gsl_sf_psi_e(x, result);
  595.   }
  596.   else {
  597.     gsl_sf_result ln_nf;
  598.     gsl_sf_result hzeta;
  599.     int stat_hz = gsl_sf_hzeta_e(n+1.0, x, &hzeta);
  600.     int stat_nf = gsl_sf_lnfact_e((unsigned int) n, &ln_nf);
  601.     int stat_e  = gsl_sf_exp_mult_err_e(ln_nf.val, ln_nf.err,
  602.                                            hzeta.val, hzeta.err,
  603.                        result);
  604.     if(GSL_IS_EVEN(n)) result->val = -result->val;
  605.     return GSL_ERROR_SELECT_3(stat_e, stat_nf, stat_hz);
  606.   }
  607. }
  608.  
  609.  
  610. /*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
  611.  
  612. #include "eval.h"
  613.  
  614. double gsl_sf_psi_int(const int n)
  615. {
  616.   EVAL_RESULT(gsl_sf_psi_int_e(n, &result));
  617. }
  618.  
  619. double gsl_sf_psi(const double x)
  620. {
  621.   EVAL_RESULT(gsl_sf_psi_e(x, &result));
  622. }
  623.  
  624. double gsl_sf_psi_1piy(const double x)
  625. {
  626.   EVAL_RESULT(gsl_sf_psi_1piy_e(x, &result));
  627. }
  628.  
  629. double gsl_sf_psi_1_int(const int n)
  630. {
  631.   EVAL_RESULT(gsl_sf_psi_1_int_e(n, &result));
  632. }
  633.  
  634. double gsl_sf_psi_n(const int n, const double x)
  635. {
  636.   EVAL_RESULT(gsl_sf_psi_n_e(n, x, &result));
  637. }
  638.